package com.zx.serviceribbon.service;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

/**
 * @Description RibbonService
 * @Author Zhang Xin
 * @Date 2020/7/22
 */
@Service
public class RibbonService {
    @Autowired
    RestTemplate restTemplate;

    /**
     * hiService 直接用的程序名替代了具体的url地址，
     * 在ribbon中它会根据服务名(eureka-client-service:大小写都可以、不区分大小写)来选择具体的服务实例，
     * 根据服务实例在请求的时候会用具体的url替换掉服务名
     *
     * 注解 @HystrixCommand 对该方法创建了熔断器的功能，并指定了fallbackMethod熔断方法
     * 当 service 不可用的时候，service-ribbon调用API接口时，会执行快速失败，直接返回一组字符串，而不是等待响应超时，这很好的控制了容器的线程阻塞。
     * @Param: [name]
     * @Return: java.lang.String
     */
    @HystrixCommand(fallbackMethod = "HystrixError")
    public String hiService(String name) {
        return restTemplate.getForObject("http://EUREKA-CLIENT-SERVICE/hi?name="+name,String.class);
    }

    public String HystrixError(String name) {
        return "Hystrix,"+name+",sorry,error!";
    }
}
